perm filename UDPLAY.FAI[T,LCS] blob
sn#026006 filedate 1973-02-20 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00009 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE UDPLAY WITH SPACEWAR, DECEMBER 1972
C00010 00003 BEGIN MAIN BODY OF PROGRAM
C00013 00004 FILLBUF
C00020 00005 FIND FILE
C00021 00006 SPACE WAR JOB
C00024 00007 GETBUF - MAKE AN I/O BUFFER
C00025 00008 UUO SERVICE
C00026 00009 STORAGE:
C00027 ENDMK
C⊗;
TITLE UDPLAY WITH SPACEWAR, DECEMBER 1972
; ROUTINE TO READ THE OUTPUT FROM THE MUSIC
; PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
;
; READS FROM UDP DATA WRITTEN WITH 'MUSIO'. THIS READS FROM A FILE
; STRUCTURED UDP ONTO DAC
↓A ← 1 ;WORK
↓B ← 2 ;WORK
RET ← 3 ;RETURN ACCUMULATOR
C ← 4 ;WORK
↓PTR ← 11 ;BUFFER POINTER
↓P ← 17 ;A PDL
PLEN← 10 ;SIZE OF PDL
NOWAIT←400 ; INHIBIT 'XXX is busy, will you wait?`
EXTERNAL JOBFF,JOBREL,JOBSA,JOBSYM,GTFILN
;GTFILN IS TO BE FOUND ON TVRLIB[1,TVR]
;** CHANGE NEXT TO 14 FOR 'UDPBIG' (TO PLAY AT HIGH SRATES-DOUBLES CORE)
;SEE IF 20 RATHER THAN 7 KEEPS US GOIN'
;BLKS ← =18
;BLKS ←← =10
BLKS ←← =20
;**** 1312 IS FOR 2314 DSK. CHANGE NUMBER IF NEEDED FOR 3330 DSK. *****
UDPSIZ←←200*=18+40 ;18(DECIMAL) 200(OCTAL) WORD RECORDS + 40 (OCTAL) RETRIEVAL RECORD
LNKSIZ ←← =4 ;except for 4 link words.
BLKSIZ ←← UDPSIZ-LNKSIZ ;use the whole 1056 words in each block for data,
ENTSIZ ←← =6 ;number of words in each directory entry.
DIRSIZ ←← ((BLKSIZ-LNKSIZ)/ENTSIZ)*ENTSIZ ;number of usable words in each directory block (175 6-word entries).
BUFSIZ ← BLKSIZ*BLKS
↓DSKCHN ←1 ;DISK CHANNEL FOR INPUT
↓ADCHN ←2 ;D-A CHANNEL FOR OUTPUT
OPDEF SJRST [1B8]
OPDEF ERROR [2B8]
OPDEF READCH [51B8]
OPDEF RESET [CALLI 0]
OPDEF CORE [CALLI 11]
OPDEF SLEEP [CALLI 31]
OPDEF SETNAM [CALLI 400002]
OPDEF DISMIS [CALLI 400042]
OPDEF DSKPPN [CALLI 400071]
OPDEF LOCK [CALLI 400076]
OPDEF UNLOCK [CALLI 400077]
OPDEF MESSAGE[51B8!3B12]
BEG: HLRO A,JOBSYM ;SAVE SYMBOLS
MOVN A,A
ADD A,JOBSYM
HRLM A,JOBSA
HRRZM A,JOBFF
MOVE A,[SIXBIT/UDPLAY/]
SETNAM A,
RESET
MOVE P,[IOWD PLEN,PLIST]
MOVE [JSR UUOSER]
MOVEM 41
OUTSTR [ASCIZ/
*** Play from file structured UDP (with Spacewar) ***
(Use UDFAST for 100KC in scratch area or non-
structured UDP)
/]
PUSHJ P,GETUDP ;MAKE SURE WE HAVE UDP BEFORE DOING DIALOGUE
MOVEI A,BUFSIZ+4 ;GET FIRST BUFFER FOR UDP
PUSHJ P,GETBUF
MOVEM A,PBUFFER
FLOOP: OUTSTR [ASCIZ/
UDP FILE = /]
PUSH P,[FILENAM-2]
PUSHJ P,GTFILN
PUSH P,[FILENAM]
PUSHJ P,SEARCH
JRST [ OUTSTR [ASCIZ/FILE NOT FOUND/]
JRST FLOOP]
MOVEM 1,FILNUM
RESET
;FIND OUT NUMBER OF CHANNELS AND
;THE SPEED.
NCHNS: OUTSTR [ASCIZ/
How many channels? /]
INCHRW A
CAIE A,175
CAIN A,177
JRST BEG
CAIE A,15
CAIN A,12
JRST NCHNS+1
SUBI A,"0"+1 ;CONVERT TO BINR AND ADD 1
CAIG A,3
SKIPGE A
JRST [ OUTSTR [ASCIZ/
Illegal number of channels/]
JRST NCHNS]
DPB A,[POINT 2,OUTBIT,26]
SETSPD: OUTSTR [ASCIZ/
What is the speed? /]
INCHRW A
CAIE A,175
CAIN A,177
JRST BEG
CAIE A,15
CAIN A,12
JRST SETSPD+1
SUBI A,"0"
CAIG A,5
SKIPG A
JRST [ OUTSTR [ASCIZ/
Illegal speed/]
JRST SETSPD]
DPB A,[POINT 3,OUTBIT,32]
; GET READY TO PLAY
LX: OUTSTR [ASCIZ/
Type 'P` to play: /]
INCHRW A
CAIE A,175
CAIN A,177
JRST BEG
CAIE A,15
CAIN A,12
JRST LX+1
caie a,"P"
jrst LX
PUSHJ P,[
GETUDP: INIT DSKCHN,NOWAIT+17 ;MODE
SIXBIT/UDP/ ;DEVICE NAME
0 ;NO BUFFER HEADERS
SKIPA
POPJ P,
ERROR [ASCIZ/
UDP is in use or assigned to another job.
/]
ENTER DSKCHN,[0
0
0
0]
ERROR [ASCIZ/
I'm sorry, but I don't believe that you have the Scratch Pack mounted.
Maybe someone has put a password on it.
/]]
MOVEI A,BUFSIZ+4 ;GET FIRST BUFFER FOR UDP
PUSHJ P,GETBUF
MOVEM A,PBUFFER
ADDI A,BUFSIZ
MOVEM A,PBUFEND
MOVE A,PBUFFER ;MAKE AN IOWD FOR THE LOSING SPACEWAR
SUB A,[XWD BUFSIZ,1] ;JOB
MOVEM A,ADIOWD ;WHEN HE GETS THIS, HE'LL GO
GETAD: OPEN ADCHN,[117 ;MODE
'AD ' ;DEVICE NAME
0] ;NO BUFFER HEADERS
ERROR [ASCIZ/Device AD is unavailable.
/]
; INPUT DSKCHN,[IOWD 1,NWD
; 0 ]
MOVE PBUFEND ;CONVINCE FILLBUF TO FILL THE BUFFER
MOVEM PDP6WD
SETOM WRAP ;FOR THE CONVIENCE OF FILLBUF, SET TO ZERO
;AFTER CALLING IT
SETOM RUDONE ;DON'T START YET
MOVE PTR,PBUFFER ;NEXT WORD TO USE IN BUFFER
MOVE FILNUM ;SET UP FILE NUMBER
MOVEM 3(PTR)
PUSHJ P,FILLBUF ;FILL UP BUFFER
JFCL ;DON'T WORRY ABOUT ERROR RETURNS!
SETZM WRAP
PLA2: MOVEI A,10
MOVEM A,WT#
SPCWAR 17,SWJOB ;START THE SPACEWAR JOB GOING
MOVEI A,1
SKIPL WT
JRST[ SLEEP A, ;WAIT FOR A FEW SECONDS
JRST .-1]
OUTSTR [ASCIZ/
GO? /]
INCHRW A ;NOW WAIT FOR THE USER
CAIE A,175 ;DOES HE WANT TO GIVE UP
CAIN A,177
JRST OUT ;YES!
MOVE A,[SIXBIT/GOT 6!/] ;TELL THE WORLD THAT WE'RE NASTY!
SETNAM A,
LOCK ;LOCK US INTO CORE!
; BEGIN MAIN BODY OF PROGRAM
SETZM DATERR ;CLEAR ERROR FLAG
SETZM RUDONE
SETZM PDPERR ;THIS STARTS IT
LOOP: PUSHJ P,FILLBUF ;FILL UP THE BUFFER
JRST [ SKIPN RUDONE ;STILL RUNNING?
SJRST LOOP ;MORE TO GO, SLEEP 1/60 SECOND AND TRY AGAIN
JRST OUT1]
OUT1: SKIPN RUDONE ;PDP-10 DONE!, WAIT FOR PDP-6
SJRST OUT1 ;SLEEP AND TRY AGAIN
OUT: UNLOCK ;UNLOCK US FROM CORE
SPCWAR 0,'SSW'
MOVE A,[SIXBIT/UDPLAY/]
SETNAM A,
close dskchn, ;END OF PROGRAM.
releas adchn,
RESET ;RESET I/O AND FREE BUFFER SPACE
SHRINK: MOVE A,JOBFF
CORE A,
ERROR [ASCIZ/HORRIBLE ERROR! CAN'T SHRINK CORE!!!/]
SKIPE DATERR
ERROR [ASCIZ/Data transmission error./]
SKIPE PDPERR
ERROR [ASCIZ/
The PDP-6 is hung, try restarting it at 204./]
SKIPE WRAP
OUTSTR [ASCIZ/
CAN'T GET UDP ACCESS FAST ENOUGH OR NOT BEING RUN QUICKLY ENOUGH,
TRY AGAIN, AND IF YOU STILL LOSE, SEE IF YOU CAN GET PEOPLE TO STOP
WHILE YOU TRY A THIRD(?) TIME.
GOOD LUCK!/]
jrst LX
SUBTTL FILLBUF
COMMENT ⊗
FILLBUF READS FROM A FILE STRUCTURED UDP INTO A CIRCULAR BUFFER
AND KEEPS IOWDS READY FOR THE PDP-6. IT KEEPS TWO IOWDS AROUND
OUTWC AND NOUTWC. OUTWC IS USED BY PDP-6 ROUTINE TO GET AN IOWD
INTO ITS AC. ONCE IT OBTAINS IT, IT ZEROS IT SO THAT THE PDP-10
ROUTINE KNOWS IT HAS IT. THE PDP-10 UPDATES THIS WORD WHENEVER
IT READS MORE IN UNTIL IT WRAPS AROUND. THEN IT USES NOUTWC IN
THE SAME WAY AS OUTWC, CHECKING PDP6WD TO MAKE SURE IT DOESN'T
OVERWRITE THE PART OF THE BUFFER THE PDP-6 IS USING. WHEN THIS
HAPPENS, FILLBUF TAKES A NON-SKIP RETURN, INDICATING THAT THE
BUFFER IS FULL. IF END OF FILE OCCURS, IT TAKES A SKIP RETURN.
UDP block format (from UDP[CSP,SYS]):
_________________________________________________
| |
| |
| |
| UDPBLK-4 data words |
| |
| |
|_______________________________________________|
| BLOCK IDENTIFIER (unique) |
| (UDP block number of first block of the file) |
|_______________________________________________|
| LINK TO PRECEEDING BLOCK |
| (-1 for the first block of a file) |
|_______________________________________________|
| |
| UDP BLOCK NUMBER OF THIS BLOCK |
|_______________________________________________|
| LINK TO FOLLOWING BLOCK |
| (-1 for the last block of a file) |
|_______________________________________________|
The link information is used to chain together the parts of a file,
which need not be in sequential order. They are at the end of the
block so that in loading a core buffer with a data file, the parts of
the file may simply be read in over the link info for the preceeding
block.
⊗;
BEGIN FILLBUF
↑FILLBU:
HRRZ A,PDP6WD ;GET LAST BLOCK PDP-6 FINISHED
CAILE A,(PTR)
JRST BELOW
; WHEN PDP-10 ABOVE PDP-6, CHECK WITH END OF BUFFER. IF END OF BUF-
; FER, RESET TO BEGINNING OF BUFFER AND SET WRAP TO -1
ABOVE: CAMN PTR,PBUFEND ;AT END?
JRST ATEND
SKIPG 3(PTR) ;NO, MAKE SURE THERE'S SOMETHING THERE
JRST [ SETZM (PTR)
MOVS PTR ;BLT UP A WORD OF ZEROS
HRRI 1(PTR)
BLT @PBUFEND ;ZERO REMAINDER OF BUFFER
SETZM WRAP ;SO HE WON'T WRAPAROUND
AOS (P) ;EOF
POPJ P,]
PUSHJ P,DOREAD ;READ BLOCK INTO BUFFER
ADDI PTR,BLKSIZ
JRST FILLBU
ATEND: MOVE A,3(PTR) ;COPY LINK TO FOLLOWING BLOCK
MOVE PTR,PBUFFER
MOVEM A,3(PTR)
SETOM WRAP
JRST FILLBU
; WHEN PDP-10 BELOW PDP-6, CHECK WITH PDP-6 AND MAKE SURE PDP-6 HAS
; NOT GRONKED WRAP
BELOW:
; SKIPL WRAP ;IF PDP-6 GRONKED IT, THEN DO A
; JRST [ AOS (P) ;FAILURE RETURN
; POPJ P,]
SKIPG 3(PTR) ;MAKE SURE THERE'S SOMETHING THERE
JRST [ MOVE PBUFFER ;MAKE A NEW IOWD
SUB PTR
HRLM ADIOWD
SETZM WRAP ;TELL PDP-6 I'M DONE
AOS (P) ;EOF
POPJ P,]
CAIG A,UDPSIZ(PTR) ;ARE WE SITTING ON HIM?
POPJ P, ;CONSIDER BUFFER IS FULL THEN
PUSHJ P,DOREAD ;READ A BLOCK
ADDI PTR,BLKSIZ
JRST FILLBU
; READ A BLOCK INTO OUR BUFFER
DOREAD: MOVE 3(PTR)
MOVEM BLKNUM
MOVNI UDPSIZ
HRLI -1(PTR)
MOVSM UDPIOWD
IN DSKCHN,UDPIOWD
POPJ P,
OUTSTR [ASCIZ/UDP ERROR, WILL CONTINUE
/]
POPJ P,
BEND FILLBUF
SUBTTL FIND FILE
BEGIN SEARCH
FILE←B
EXT←FILE+1
PPN←EXT+2
↑SEARCH: MOVEI 1
MOVEM BLKNUM
MOVE PBUFFER
SUBI 1
HRLI -DIRSIZ
MOVEM UDPIOWD
IN DSKCHN,UDPIOWD
CAIA
ERROR [ASCIZ/ERROR READING UDP DIRECTORY
/]
MOVEI FILE
HRL -1(P)
BLT PPN
SKIPN PPN
DSKPPN PPN,
MOVE A,PBUFFER
ADDI A,DIRSIZ-ENTSIZ
LOOP: SUBI A,ENTSIZ
CAMGE A,PBUFFER
POPJ P,
CAMN PPN,3(A)
CAME FILE,(A)
JRST LOOP
HLLZ 1(A)
CAME EXT
JRST LOOP
HRRZ 1,1(A)
AOS (P)
SUB P,[XWD 2,2]
JRST @2(P)
BEND
; SPACE WAR JOB
BEGIN SWJOB
AD←←424
DC←←204
PI←4
PION←←200
PIOFF←←400
↑SWJOB: SOSL WT ;ARE WE DONE WAITING?
DISMIS ;NO, RETURN
SKIPE RUDONE ;ARE WE DONE?
DISMIS ;YES, RETURN
CONSZ 40 ;CHECK TO SEE IF ON THE PDP-6
JRST[ SETOM PDPERR
SETOM RUDONE
DISMIS]
CONO PI,PIOFF ;I REALLY HATE TO DO THIS BUT...
SETOM PIFLAG
MOVE 2,OUTBIT ;SET UP THE AD
CONO AD,(2)
MOVE 2,ADIOWD+1 ;AND THE 136
CONO DC,(2)
MOVEI 2,BLKSIZ ;SET WORD COUNT FOR NEXT STATUS
GETBUF: MOVE 1,ADIOWD ;GET IOWD FOR BUFFER
LOOP: CONSO DC,1000 ;IS THE 136 READY FOR A WORD
JRST LOOP ;NO, TRY AGAIN
BLKO DC,1 ;YES, GIVE IT TO HIM
JRST NXTBUF ;HE RAN OUT OF DATA, GET READY FOR MORE
SOJGE 2,LOOP ;DID WE FINISH A BLOCK?
MOVEM 1,PDP6WD ;TELL PDP-10 WHAT WE WILL USE
MOVEI 2,BLKSIZ ;SET WORD COUNT FOR NEXT STATUS
JRST LOOP ;OK, WAIT FOR 136 TO BE READY
NXTBUF: EXCH 1,WRAP ;TELL PDP-10 WE'VE WRAPPED AROUND
SKIPN KILL
JUMPL 1,GETBUF
MOVEM 1,WRAP ;REPLACE WITH LOSER
CONSZ DC,10000 ;DID WE GET DATA MISSED?
SETOM DATERR ;SET LOSING FLAG
CONO PI,PION ;LET TIME-SHARING CONTINUE
SETZM PIFLAG
SETOM RUDONE ;TELL PDP-10 WE'RE DONE
DISMIS
↑KILL: 0
↑PDPERR: 0
↑DATERR: 0
↑RUDONE: 0
↑PDP6WD: 0
↑WRAP: 0
↑PIFLAG: 0
BEND SWJOB
; GETBUF - MAKE AN I/O BUFFER
BEGIN ALLOC
↑GETBUF:ADD A,JOBFF
PUSH P,A ;SAVE WHAT WILL BE JOBFF
GETBU2: CALL A,[SIXBIT/CORE/]
JRST [ OUTSTR [ASCIZ/
Can't get enough core!
/]
MOVE A,(P) ;RECOVER WHAT SHOULD BW JOBFF
HALT GETBU2] ;ALLOW THE LOSER TO TRY AGAIN
POP P,A ;RECOVER WHAT WILL BE JOBFF
EXCH A,JOBFF
POPJ P,
BEND ALLOC
; UUO SERVICE
BEGIN UUOSER
↑UUOSER: 0
MOVEM A,SAVEA#
LDB A,[POINT 9,40,8]
CAIG A,MAXUUO
JUMPG A,@UUOTAB(A)
OUTSTR [ASCIZ/ILLEGAL USER/] ;UUO AT /]
; HRRZ A,UUOSER
; PUSH P,A
; PUSHJ P,OCTOUT
CALLI 1,12
OUTSTR [ASCIZ/CAN'T CONTINUE/]
JRST .-2
UUORET: MOVE A,SAVEA
JRST 2,@UUOSER
UUOTAB←.-1
[ SETZ A, ;1 SLEEP & JRST
SLEEP A,
MOVE A,40
HRRM A,UUOSER
JRST UUORET]
[ OUTSTR @40 ;2 ERROR
CALLI 1,12
JRST UUORET]
MAXUUO←.-UUOTAB
BEND UUOSER
; STORAGE:
NWD: 0 ;FOR NUMBER OF WORDS OF INPUT.
0
CLIST: IOWD 1,NWD ;FOR THE FIRST RECORD
0
↓PBUFFER: 0 ;POINTER TO BEGINNING OF BUFFER
↓PBUFEND: 0 ;POINTER TO END OF BUFFER
↓FILNUM: 0
↓UDPIOW: 0 ;WILL CONTAIN AN IOWD
↓BLKNUM: 0
↓ADIOWD: 0 ;WILL CONTAIN AN IOWD FOR D-A
3650 ;MAGIC BITS FOR 136.
OUTBIT: 4000 ;BITS FOR D-A
BLOCK 2
FILENAM: BLOCK 4
PLIST: BLOCK PLEN
end beg